﻿
// CompileDlg.h: 头文件
//

#pragma once
#include <string>
#include <vector>
#include <stack>
// CCompileDlg 对话框
using namespace std;

/*
	   四则运算表达式的语法为：
	   1.Term = <数字> | "("Exp")"
	   2.Factor = Term (("*" | "/") Term)*
	   3.Exp = Factor (("+" | "-") Factor)*
*/

struct Exception
{
	int    Loc; // 错误位置
	string Error; // 错误信息

	Exception(int aLoc, const string& aError)
	{
		Loc = aLoc;
		Error = aError;
	}
};

class CCompileDlg : public CDialogEx
{
	// 构造
public:
	CCompileDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_COMPILE_DIALOG };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnClickedButtonClear();
	afx_msg void OnClickedButtonTranslate();

	CEdit InputControl;
	CEdit After;
	CEdit Result;
	CEdit Fault;

	bool Judge_flag = true; //判断是否有误
	vector<int> string_num; //转换后的每个字符串个数
	int Judge_Temp; //错误位置
	stack<double> result; //计算栈
	vector <string> res; //后缀表达式
	string fault; //错误内容


	vector<string> GetPostfixExpression(vector<string> str);
	double Calculate(string s);
	int getPriority(string ch);
	vector<string> num_to_string(string str);
	int Location(int i); //寻找错误位置
	void OutputFault(int i, vector<string> str, string op); //错误：一个运算符对应两个运算数


	void GetNumber(const string& Stream, int& pos);
	void GetTerm(const string& Stream, int& pos);
	void GetFactor(const string& Stream, int& pos);
	void GetExp(const string& Stream, int& pos);

};
